﻿using System;
using System.Collections;
using System.Web;
using System.Text.RegularExpressions;

    /// <summary>
    /// Summary description for Convert.
    /// </summary>
    public class clsText
    {
        private static char[]
         coDauA = { 'â','á','ă','à','ả',
      'ạ','ấ','ầ','ẩ','ậ',
      'ắ','ằ','ẳ','ặ','ã','ẫ','ẵ'};

        private static char[]
         coDauO = { 'ô','ó','ò','ỏ','ọ',
      'õ','ơ','ố','ồ','ổ',
      'ỗ','ộ','ớ','ờ','ở','ợ','ỡ'};

        private static char[]
         coDauE = { 'ê','é','è','ẻ','ẹ',
      'ẽ','ế','ề','ể','ệ','ễ'};

        private static char[]
         coDauU = { 'ú','ù','ủ','ụ','ũ','ư',
      'ứ','ừ','ử','ự','ữ'};

        private static char[]
         coDauI = { 'í', 'ì', 'ỉ', 'ị', 'ĩ' };

        private static char[]
         coDauY = { 'ý', 'ỳ', 'ỷ', 'ỵ', 'ỹ' };

        private static char[]
         coDauD = { 'đ' };

        public clsText()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        /// <summary>
        /// Chuyen tu chu co dau sang chu khong dau
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static string NoSign(string fileName)
        {
            fileName = HttpContext.Current.Server.HtmlDecode(fileName);

            if (fileName == null)
                return string.Empty;

            fileName = Replace(fileName, coDauA, 'a');
            fileName = Replace(fileName, coDauO, 'o');
            fileName = Replace(fileName, coDauE, 'e');
            fileName = Replace(fileName, coDauU, 'u');
            fileName = Replace(fileName, coDauI, 'i');
            fileName = Replace(fileName, coDauY, 'y');
            fileName = Replace(fileName, coDauD, 'd');

            fileName = fileName.Replace("?", "");
            return fileName;
        }

        public static string ToSEO(string Name)
        {
            if (Name.Trim().Length < 1) return "";

            string str = NoSign(Name).Trim();
            //str = str.Replace("?", "").Replace(":", "").Replace(",", "").Replace("'", "").Replace("%", "").Replace("\"", "").Replace("“", "").Replace("”", "").Replace("&", "").Replace(".", "").Replace("(", "").Replace(")", "").Replace(" ", "-");
            //str = str.Replace("...", "");
            //str = str.Replace("#", "");
            //str = str.Replace("---", "-");
            //str = str.Replace("--", "-");
            str = Regex.Replace(str, @"[!@#$%^&*""()<>?{}/*-+|]", string.Empty);
            str = Regex.Replace(str, @"[ ]", "-");
            //str = Regex.Replace(str, @".", "");

            while(str.Contains("--"))
                str = Regex.Replace(str, @"--", "-");
            
            return str.ToLower();
        }

        public static string ToKeyword(string fileName)
        {
            return NoSign(fileName).Replace(" ", "-");
        }

        /// <summary>
        /// Thay the chuoi ky tu co dau thanh khong dau.
        /// </summary>
        /// <param name="oldString"></param>
        /// <param name="coDau"></param>
        /// <param name="newChar"></param>
        /// <returns></returns>
        private static string Replace(string oldString, char[] coDau, char newChar)
        {
            for (int i = 0; i < oldString.Length; i++)
                for (int j = 0; j < coDau.Length; j++)
                    if (char.ToLower(oldString[i]).Equals(char.ToLower(coDau[j])))
                    {
                        if (char.IsUpper(oldString[i]))
                            oldString = oldString.Replace(oldString[i], char.ToUpper(newChar));
                        else
                            oldString = oldString.Replace(oldString[i], char.ToLower(newChar));
                    }
            return oldString;
        }

        public static string Strip(string text)
        {
            return Regex.Replace(text, @"<(.|\n)*?>", string.Empty);
        }

        public static string DoPlainText(string source)
        {
            try
            {
                string result;

                // Remove HTML Development formatting

                // Replace line breaks with space

                // because browsers inserts space

                result = source.Replace("\r", " ");
                // Replace line breaks with space

                // because browsers inserts space

                result = result.Replace("\n", " ");
                // Remove step-formatting

                result = result.Replace("\t", string.Empty);
                // Remove repeating speces becuase browsers ignore them

                result = System.Text.RegularExpressions.Regex.Replace(result,
                                                                      @"( )+", " ");

                // Remove the header (prepare first by clearing attributes)

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*head([^>])*>", "<head>",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"(<( )*(/)( )*head( )*>)", "</head>",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         "(<head>).*(</head>)", string.Empty,
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                // remove all scripts (prepare first by clearing attributes)

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*script([^>])*>", "<script>",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"(<( )*(/)( )*script( )*>)", "</script>",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                //result = System.Text.RegularExpressions.Regex.Replace(result, 

                //         @"(<script>)([^(<script>\.</script>)])*(</script>)",

                //         string.Empty, 

                //         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"(<script>).*(</script>)", string.Empty,
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                // remove all styles (prepare first by clearing attributes)

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*style([^>])*>", "<style>",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"(<( )*(/)( )*style( )*>)", "</style>",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         "(<style>).*(</style>)", string.Empty,
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                // insert tabs in spaces of <td> tags

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*td([^>])*>", "\t",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                // insert line breaks in places of <BR> and <LI> tags

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*br( )*>", "\r",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*li( )*>", "\r",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                // insert line paragraphs (double line breaks) in place

                // if <P>, <DIV> and <TR> tags

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*div([^>])*>", "\r\r",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*tr([^>])*>", "\r\r",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<( )*p([^>])*>", "\r\r",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                // Remove remaining tags like <a>, links, images,

                // comments etc - anything thats enclosed inside < >

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"<[^>]*>", string.Empty,
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                // replace special characters:

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @" ", " ",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&bull;", " * ",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&lsaquo;", "<",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&rsaquo;", ">",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&trade;", "(tm)",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&frasl;", "/",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&lt;", "<",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&gt;", ">",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&copy;", "(c)",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&reg;", "(r)",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                // Remove all others. More can be added, see

                // http://hotwired.lycos.com/webmonkey/reference/special_characters/

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         @"&(.{2,6});", string.Empty,
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);

                // for testng

                //System.Text.RegularExpressions.Regex.Replace(result, 

                //       this.txtRegex.Text,string.Empty, 

                //       System.Text.RegularExpressions.RegexOptions.IgnoreCase);


                // make line breaking consistent

                result = result.Replace("\n", "\r");

                // Remove extra line breaks and tabs:

                // replace over 2 breaks with 2 and over 4 tabs with 4. 

                // Prepare first to remove any whitespaces inbetween

                // the escaped characters and remove redundant tabs inbetween linebreaks

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         "(\r)( )+(\r)", "\r\r",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         "(\t)( )+(\t)", "\t\t",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         "(\t)( )+(\r)", "\t\r",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                result = System.Text.RegularExpressions.Regex.Replace(result,
                         "(\r)( )+(\t)", "\r\t",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                // Remove redundant tabs

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         "(\r)(\t)+(\r)", "\r\r",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                // Remove multible tabs followind a linebreak with just one tab

                result = System.Text.RegularExpressions.Regex.Replace(result,
                         "(\r)(\t)+", "\r\t",
                         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                // Initial replacement target string for linebreaks

                string breaks = "\r\r\r";
                // Initial replacement target string for tabs

                string tabs = "\t\t\t\t\t";
                for (int index = 0; index < result.Length; index++)
                {
                    result = result.Replace(breaks, "\r\r");
                    result = result.Replace(tabs, "\t\t\t\t");
                    breaks = breaks + "\r";
                    tabs = tabs + "\t";
                }

                // Thats it.

                return result;

            }
            catch
            {
                return source;
            }
        }
    }
